package com.amoyt.project.exception;

import com.amoyt.project.domain.res.Result;
import io.lettuce.core.RedisException;
import io.minio.errors.MinioException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.ReflectionException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.io.IOException;
import java.sql.SQLException;

/**
 * @Date: 2025/8/10
 * @Time: 16:04
 * @Author: TQ_QT
 * @Description: 全局异常处理器，捕获并返回，只对捕获 MVC 的异常，不针对Servlet部分
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 处理自定义业务异常（最常用）
     * 例如：用户不存在、权限不足等业务场景抛出的异常
     */
    @ExceptionHandler(value = BusinessException.class)
    public Result handleBusinessException(BusinessException e, HttpServletRequest request) {

        // 日志记录异常信息（可选，便于排查问题）
        log.error("业务异常：{}，请求路径：{}", e.getErrorMsg(), request.getRequestURI());
        // 直接返回错误响应（状态码、消息、请求路径）
        return Result.fail(e.getErrorCode(),e.getErrorMsg());
    }

    /**
     * 登录异常
     */
//    @ExceptionHandler(value = AuthenticationException.class)
//    public Result handleLoginException(AuthenticationException e, HttpServletRequest request) {
//        // 日志记录异常信息（可选，便于排查问题）
//        log.error("登录异常：{}，请求路径：{}", e.getMessage(), request.getRequestURI());
//        // 直接返回错误响应（状态码、消息、请求路径）
//        return Result.fail(401, "登录失败！");
//    }

    /**
     * 请求异常
     * @param e
     * @param request
     * @return
     */
    @ExceptionHandler(value = HttpMessageNotReadableException.class)
    public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e, HttpServletRequest request) {
        // 日志记录异常信息（可选，便于排查问题）
        log.error("请求异常：{}，请求路径：{}", e.getMessage(), request.getRequestURI());
        // 直接返回错误响应（状态码、消息、请求路径）
        return Result.fail(400, "请求参数不合法！");
    }

    /**
     * 处理系统异常（最常用）
     * 例如：空指针异常、类型转换异常、SQL异常等系统级异常
     */
    @ExceptionHandler({
            IOException.class,
            //sql异常
            SQLException.class,
            //类型转换异常
            ClassCastException.class,
            //空指针异常
            NullPointerException.class,
            //redis异常
            RedisException.class,
            //minio异常
            MinioException.class
    })
    public Result handleException(Exception e, HttpServletRequest request) {
        // 日志记录异常信息（可选，便于排查问题）
        e.printStackTrace();
        log.error("系统异常：{}，请求路径：{}", e.getMessage(), request.getRequestURI());
        // 直接返回错误响应（状态码、消息、请求路径）
        return Result.error("系统异常");
    }

}
